//函数类型

//1、函数function关键字来定义函数
//2、函数表达式定义函数（可以描述变量的类型）
//函数有入参和返回值（针对这两个部分，掌握函数）
//函数本身的类型
//------------1、常见的类型推倒方式--------------
//推荐
function sum1(a:string,b:string):string{
    return a+b
}
//推荐
const sum2=(a:string,b:string):string=>{
    return a+b;
}
const sum3:(a:string,b:string)=>string=(a:string,b:string):string=>{
    return a+b;
}
type ISum=(a:string,b:string)=>string
const sum4:ISum=(a:string,b:string):string=>{
    return a+b;
}
//推荐
const sum5:ISum=(a,b)=>{
    return a+b;
}

//------------2、根据返回值进行类型推倒，自动推到返回值--------------
function sum6(a:number,b:number){
    return a+b
}
const s6=sum6(1,3)

//------------3、根据上下文来推到赋予值的类型（根据位置来推到）--------------
type ICallback=(x:string,y:number,z:boolean)=>void //void表示不关心返回值的类型，换句话说，写了void，用什么返回值就行
function fn(callback:ICallback){

}
fn((x,y,z)=>{
    return {}
})
fn((x,y,z)=>{
    return true
})
//------------函数中的参数------------
//1、函数中的可选参数
function sum7(a:string,b?:string){
    return a+b
}
const s7=sum7('1')

//2、函数中的默认值：增加=表示默认值
function sum8(a:string,b:string='66'){
    return a+b
}
const s8=sum7('1')

//3、函数中的剩余参数（剩余运算符，类型是数组）
const total=(...rest:number[]):number=>{
    return rest.reduce((t,current)=>(t+=current,t))
}

//------------4、获取变量的类型--------------
const obj={
    name:'zh',
    age:22
}
function getVal(this:typeof obj,key:keyof typeof obj){  //typeof obj先获取对象的类型，keyof再获取对象的key

}
type IThis=typeof obj
function getVal2(this:IThis,key:keyof IThis){  //typeof obj先获取对象的类型，keyof再获取对象的key

}
getVal.call(obj,'name')

//------------5、重载-------------
function toArray(num:string):string[]
function toArray(num:number):number[]
function toArray(num:string | number):string[] | number[]{
    if(typeof num==='string'){
        return num.split('')
    }else{
        return num.toString().split('').map(Number)
    }
}
const t1=toArray(123)

export {}